// 将示例代码封装在一个函数中
pub fn run_examples() {
  println!("===== Rust tuple 元组示例 =====\n");

  // 1. tuple 类型定义及基础使用
  println!("1. tuple 类型定义及基础使用:");
  example_1();

  // 2. 元组的访问方式
  println!("\n2. 元组的访问方式:");
  example_2();

  // 3. 元组的解构
  println!("\n3. 元组的解构:");
  example_3();

  // 4. 单元元组
  println!("\n4. 单元元组:");
  example_4();

  // 5. 元组与模式匹配
  println!("\n5. 元组与模式匹配:");
  example_5();
}

// 1. tuple 类型定义及基础使用
fn example_1() {
  // 元组中的元素可以是不同的类型
  let t: (u8, &str) = (1u8, "hello");
  // 元组的成员还可以是一个元组
  let _t1: (u8, (i16, u32)) = (0, (-1, 1));

  println!("   let t: (u8, &str) = (1u8, \"hello\"); // 元组的类型签名是 (T1, T2, ...), 元组中的元素可以是不同的类型");
  println!("   t.0 == {}; t.1 == {}; // 使用索引来获取元组的成员", t.0, t.1);
  println!("   let _t1: (u8, (i16, u32)) = (0, (-1, 1)); // 元组的成员还可以是一个元组");
}

// 2. 元组的访问方式
fn example_2() {
  let point = (10, 20, 30);

  // 使用索引访问元组元素
  println!("   如let point = (10, 20, 30);");
  println!("   x == {}; y == {}; z == {}; // 使用索引访问元组元素 (从0开始)", point.0, point.1, point.2);
  println!("   let i = 1; let value = point.i; // 编译错误!!!. 注意: 元组索引必须在编译时已知，不能使用变量作为索引");

}

// 3. 元组的解构
fn example_3() {
  let rgb = (255, 128, 64); 
  let (red, green, blue) = rgb;
  println!("   let rgb = (255, 128, 64); // RGB颜色值");
  // 解构元组到单独的变量
  println!("   let (red, green, blue) = rgb; // 解构元组到单独的变量");
  println!("   red == {}; green == {}; blue =={}", red, green, blue);

  // 忽略某些元素
  let person = ("张三", 30, "北京");
  let (name, _, city) = person; // 忽略年龄
  println!("   let person = (\"张三\", 30, \"北京\");");
  println!("   let (name, _, city) = person; // _ 忽略年龄元素");
  println!("   name == {}; city == {}", name, city);

  // 使用..忽略剩余元素
  let numbers = (1, 2, 3, 4, 5);
  let (first, second, ..) = numbers; // 只获取前两个元素
  println!("   let numbers = (1, 2, 3, 4, 5);");
  println!("   let (first, second, ..) = numbers; // 只获取前两个元素");
  println!("   first == {}; second == {}", first, second);

  let (first, .., last) = numbers; // 获取第一个和最后一个元素
  println!("   let (first, .., last) = numbers; // 获取第一个和最后一个元素");
  println!("   first == {}; last == {}", first, last);
}


// 4. 单元元组
fn example_4() {
  // 单元类型 (), 也称为单元值或空元组
  let unit = ();
  println!("   let unit = (); // 单元类型 () 是一个特殊的零长度元组");
  println!("   单元值: {:?}", unit);

  // 返回单元类型的函数
  fn returns_unit() -> () {
    // 函数体...
    let string = "fn returns_unit() -> () {}";
    println!("   {}; // 单元类型通常用作没有返回值的函数的返回类型", string);
  }

  returns_unit();
}


// 5. 元组与模式匹配
fn example_5() {
  let status_code = (404, "Not Found");

  println!("   let status_code = (404, \"Not Found\")");
  println!("   match status_code // 模式匹配");

  match status_code {
    (200, _) => println!("       状态码200: 请求成功"),
    (404, msg) => println!("       状态码404: {}", msg),
    (code, msg) if code >= 500 => println!("       服务器错误 {}: {}", code, msg),
    _ => println!("       其他状态码: {:?}", status_code),
  }

  // 在if let中使用元组模式
  if let (500..=599, msg) = status_code {
    println!("       检测到服务器错误: {}", msg);
  } else {
    println!("       不是服务器错误: {:?}", status_code);
  }
}
